package thread;

class Counter {
    private int count = 0;

    //第三种：
    //相当于给 this 加锁
    public synchronized void add() {
        //第二种：
        //synchronized (this) {
            count++;
        //}
    }

    public int getCount() {
        return count;
    }

    //当修饰的方法中存在 static 的时候呢，我们的这个 synchronized ()里就是类方法
    //相当于给 类对象 加锁
    public synchronized static void func() {
        //方法中的 synchronized 相当于我们下面的代码块
        synchronized (Counter.class) {

        }
    }
}
public class Demo16 {
    //synchronized 的几种使用方法
    public static void main(String[] args) throws InterruptedException {
        Object locker = new Object();
        Counter counter = new Counter();

        Thread t1 = new Thread(() -> {
           for(int i = 0;i < 50000;i++) {
               //第一种：
               //synchronized (locker) {
                   counter.add();
               //}
           }
           System.out.println("t1 结束");
        });

        Thread t2 = new Thread(() -> {
           for(int i = 0;i < 50000;i++) {
               //synchronized (locker) {
                   counter.add();
               //}
           }
           System.out.println("t2 结束");
        });

        t1.start();
        t2.start();
        t1.join();
        t2.join();

        System.out.println("count = " + counter.getCount());
    }
}
